Bask

Shanghai Based Android Engineer currently develop Payment systems at Ctrip

👨‍🔧‍

浅析 Android 生命周期(一)

By Bask on null

This post is over a year old. Some of the content may be out of date.

大家可以关注我的AllAboutAndroid系列项目

没有写博客的习惯,文笔较差,敬请见谅

前言

本文将从Android SDK源码分析Android的生命周期,不仅仅包含市面上随便搜索一下就有N多的“基础”Android 生命周期。因为作为一个几百亿美元市值的大厂来说,我发现了App有N多生命周期的Bug;被某中国市值最大的互联网公司面试时,发现面试官对于生命周期理解及其之差,我觉得为了Android生态的发展,有必要普及一下Android的生命周期到底是什么样的!!

导语

相信大家在编写一段时间Android代码之后,发现其实“Android”这个东西也就是这样,随便写写就可以把产品经理及UED的设计应付的很好。“因为Android的生命周期真的特别好理解,就是一条线下来,没有什么坑,不会被埋进坑里。”这是我写了一段时间之后的感觉自身无法提高的感受。这时Bugly上发现一个特别怪异的Bug: 怪异的Bug 有用的只有一条:Unable to start activity ComponentInfo{x.x.x/x.x.x.x.x.x.XActivity}: java.lang.NullPointerException: Attempt to read from field 'java.lang.String x.x.x.x.b.a.i' on a null object reference 剩下都是Android源码,这是为什么呢??还不是必现的Bug,简直难倒当时弱鸡的我。

以下皆为吐槽经过6个月的各种查阅资料终于找到如何“必现”这个可恶的Bug,并且发现我们日均200w访问量的App竟然各种这样的Bug。纵然觉得这简直是对Android生命周期的漠视,如今各大面试及培训、博客都只会告诉你最最最基本的生命周期,但是生产上呢?问题多的可想而知。

  1. [复现方法] :这个Bug是因为Activity被系统回收,内部变量被清空而没有保存,重新创建Activity时走onCreate方法时导致的。一般情况下模拟Activity被系统回收不容易,但是可以在设置->开发者选项->不保留活动中开启。
  2. [解决方法] : 在onSaveInstanceState()方法保存需要的内部变量,onCreate时,bundle不为null,则说明是被销毁后重新创建的,这时获取保存在bundle中的值就好

浅析Activity的生命周期

看SDK其实是有步骤的,最开始看的应该是最基础的接口,先让我们看Instrumentation 类中关于Activity生命周期的东西:

public class Application extends ContextWrapper implements ComponentCallbacks2 {
......
    private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
            new ArrayList<ActivityLifecycleCallbacks>();
......
    public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }
......
}

可以看到在Application中,其实定义了一个ArrayList去储存所添加的每个Activity的生命周期。

请关注我吧!! AllAboutCoding